// 重要的一个技巧：破环为链
// 在一个环上有 n 个数 a1, a2, an，进行 n-1 次合并操作，
// 每次操作将相邻的两堆合并成一堆，能获得新的一堆中的石子数量的
// 和的得分。你需要最大化你的得分。
// 测试链接 : https://loj.ac/p/10147
// 测试链接 ：https://www.luogu.com.cn/problem/P1880
// 相似题目 : https://www.luogu.com.cn/problem/P1063
// 帖子讲解：https://oi-wiki.org/dp/interval/
// 提交以下的code，可以直接通过

#include <bits/stdc++.h>

using namespace std;

const int MAXN = 410;
int arr[MAXN], sum[MAXN];
int minDp[MAXN][MAXN], maxDp[MAXN][MAXN];
const int INF = 0x3f3f3f3f;
int n, minAns = INF, maxAns;

int read()
{
    char ch = getchar();
    int x = 0, f = 1;
    while (ch < '0' || ch > '9')
    {
        if (ch == '-')
            f = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9')
    {
        x = 10 * x + ch - '0';
        ch = getchar();
    }
    return f * x;
}

int main()
{
    n = read();
    for(int i = 1; i <= n; ++i)
    {
        arr[i + n] = arr[i] = read();
    }
    memset(minDp, 0x3f, sizeof minDp);
    memset(maxDp, -0x3f, sizeof maxDp);
    for(int i = 1; i <= 2 * n; ++i)
    {
        sum[i] = sum[i - 1] + arr[i];
        minDp[i][i] = maxDp[i][i] = 0;
    }
    for(int len = 2; len <= n; ++len) // 区间长度
    {
        for(int i = 1; i + len - 1 <= 2 * n; ++i) // 区间左端点
        {
            int j = i + len - 1; // 区间右端点
            for(int k = i; k < j; ++k) // 区间分界点
            {
                minDp[i][j] = min(minDp[i][j], minDp[i][k] + minDp[k + 1][j] + sum[j] - sum[i - 1]);
                maxDp[i][j] = max(maxDp[i][j], maxDp[i][k] + maxDp[k + 1][j] + sum[j] - sum[i - 1]);
            }
            minAns = min(minAns, minDp[i][i + n - 1]);
            maxAns = max(maxAns, maxDp[i][i + n - 1]);
        }
    }
    printf("%d\n%d\n", minAns, maxAns);

    return 0;
}